// https://iai.sh.cn/problem/494
#include <bits/stdc++.h>
using namespace std;

vector<int> times; // 全局变量，存储市民的处理时间
int n;             // 市民数量
int T;             // 时间限制

// 检查给定数量m的窗口是否能在时间 T 内处理完所有市民
bool canProcessInTime(int m) {
  priority_queue<int, vector<int>, greater<int>> Q;
  // 最小堆，用于跟踪窗口完成时间

  for (int time : times) {
    if (Q.size() < m) {
      Q.push(time); // 将市民的处理时间加入窗口
    } else {
      int earliest = Q.top();  // 获取最早完成时间
      Q.pop();                 // 从堆中移除
      Q.push(earliest + time); // 更新窗口的完成时间
    }
  }
  // 检查最后一个市民是否能在时间 T 内完成
  while (!Q.empty()) {
    if (Q.top() > T)
      return false; // 如果任何窗口的完成时间超过 T
    Q.pop();
  }
  return true; // 所有市民都能在时间 T 内完成
}

// 查找所需的最小窗口数量
int minWindows() {
  int left = 1, right = n; // 二分查找的边界
  int ans = 0;
  while (left <= right) {
    int mid = (left + right) / 2; // 计算中间值
    if (canProcessInTime(mid)) {
      ans = mid;       // 更新最小窗口数量
      right = mid - 1; // 尝试减少窗口数量
    } else {
      left = mid + 1; // 需要更多窗口
    }
  }
  return ans; // 返回找到的最小窗口数量
}

int main() {

  cin >> n;        // 输入市民数量
  times.resize(n); // 初始化全局变量
  for (int i = 0; i < n; i++) {
    cin >> times[i]; // 输入每位市民的处理时间
  }
  cin >> T;                     // 输入时间限制
  cout << minWindows() << endl; // 输出最小窗口数量
  return 0;
}
